// Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov  Date: 22/03/2011 12:23:35 p.m.
// Home Page: http://members.fortunecity.com/neshkov/dj.html  http://www.neshkov.com/dj.html - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   PedidoController.java

package com.luxsoft.sw3.impap.ui.form;

import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.ObservableElementList;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.event.ListEvent;
import ca.odell.glazedlists.event.ListEventListener;
import com.jgoodies.binding.value.ValueHolder;
import com.jgoodies.binding.value.ValueModel;
import com.jgoodies.validation.ValidationResult;
import com.jgoodies.validation.util.PropertyValidationSupport;
import com.luxsoft.siipap.compras.model.Embarcacion;
import com.luxsoft.siipap.compras.model.EntradaPorCompra;
import com.luxsoft.siipap.cxc.model.FormaDePago;
import com.luxsoft.siipap.model.Configuracion;
import com.luxsoft.siipap.model.User;
import com.luxsoft.siipap.model.UserLog;
import com.luxsoft.siipap.model.core.Cliente;
import com.luxsoft.siipap.model.core.ClienteCredito;
import com.luxsoft.siipap.service.KernellSecurity;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.service.core.ClienteManager;
import com.luxsoft.siipap.service.core.ProductoManager;
import com.luxsoft.siipap.service.ventas.PedidosManager;
import com.luxsoft.siipap.swing.form2.DefaultFormModel;
import com.luxsoft.siipap.swing.form2.IFormModel;
import com.luxsoft.siipap.swing.utils.MessageUtils;
import com.luxsoft.sw3.impap.ui.KernellUtils;
import com.luxsoft.sw3.impap.ui.selectores.SelectorDeClientes;
import com.luxsoft.sw3.impap.ui.selectores.SelectorDeEntradasParaFacturar;
import com.luxsoft.sw3.model.AdressLog;
import com.luxsoft.sw3.ventas.Pedido;
import com.luxsoft.sw3.ventas.PedidoDet;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.log4j.Logger;
import org.springframework.beans.BeanUtils;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.util.Assert;

// Referenced classes of package com.luxsoft.sw3.impap.ui.form:
//            PedidoFormValidator, PedidoDetFormModel, PedidoDetFormWork

public class PedidoController extends DefaultFormModel
    implements ListEventListener
{
    private class Handler
        implements PropertyChangeListener
    {

        public void propertyChange(PropertyChangeEvent evt)
        {
            String property = evt.getPropertyName();
            if("tipo".equals(property))
                tipoDePedidoActualizado();
            else
            if("cliente".equals(property))
                clienteActualizado();
            else
            if(!"formaDePago".equals(property) && !"entrega".equals(evt.getPropertyName()))
                if("flete".equals(evt.getPropertyName()))
                    actualizarImportes();
                else
                if("mismaDireccion".equals(property))
                    getPedido().setInstruccionDeEntrega(null);
                else
                if("mismoComprador".equals(property))
                {
                    Boolean res = (Boolean)evt.getNewValue();
                    if(res.booleanValue())
                        getPedido().setComprador(getPedido().getNombre());
                    else
                        getPedido().setComprador(null);
                }
        }
        
    }


    public PedidoController()
    {
        super(new Pedido());
        logger = Logger.getLogger(getClass());
        usuarioHolder = new ValueHolder();
        facturistaHolder = new ValueHolder();
        getPedido().setTipo(com.luxsoft.sw3.ventas.Pedido.Tipo.CREDITO);
        getPedido().setFormaDePago(FormaDePago.TRANSFERENCIA);
    }

    public PedidoController(Pedido pedido)
    {
        super(pedido);
        logger = Logger.getLogger(getClass());
        usuarioHolder = new ValueHolder();
        facturistaHolder = new ValueHolder();
    }

    public Pedido getPedido()
    {
        return (Pedido)getBaseBean();
    }

    protected void init()
    {
        partidasSource = GlazedLists.eventList(new ArrayList());
        partidasSource = new ObservableElementList(partidasSource, GlazedLists.beanConnector(PedidoDet.class, true, new String[] {
            "precio"
        }));
        partidasSource = new SortedList(partidasSource, GlazedLists.beanPropertyComparator(PedidoDet.class, "log.creado", new String[0]));
        if(getValue("id") == null)
            setValue("sucursal", ServiceLocator2.getConfiguracion().getSucursal());
        else
            partidasSource.addAll(getPedido().getPartidas());
        partidasSource.addListEventListener(this);
        handler = new Handler();
        addBeanPropertyChangeListener(handler);
        validator = new PedidoFormValidator();
    }

    public void dispose()
    {
        partidasSource.removeListEventListener(this);
        removeBeanPropertyChangeListener(handler);
    }

    protected void addValidation(PropertyValidationSupport support)
    {
        validator.validate(getPedido(), support);
        if(getPedido().getFormaDePago().equals(FormaDePago.CHEQUE_POSTFECHADO))
            getPedido().isDeCredito();
        super.addValidation(support);
        if(StringUtils.isBlank(getUsuario()))
            support.getResult().addError("Digite su clave de facturista para salvar el pedido");
    }

    public void insertarPorEntrada(){
        List<EntradaPorCompra> entradas = SelectorDeEntradasParaFacturar.seleccionarLista();        
        if(entradas == null)
            return;
        long buffer = 1000L;
        if(!entradas.isEmpty()){
        	actualizarEmbarque(entradas.get(0));
        }
        for(final EntradaPorCompra entrada:entradas){
        	/*
        	PedidoDet target = (PedidoDet)CollectionUtils.find(getPedido().getPartidas(), new Predicate() {
                public boolean evaluate(Object object){
                    PedidoDet found = (PedidoDet)object;
                    return entrada.getClave().equals(found.getClave());
                }                        
            });
            */
        	PedidoDet target =null;
            if(target == null){
                target = PedidoDet.getPedidoDet();
                long creado = System.currentTimeMillis();
                creado += buffer;
                target.getLog().setCreado(new Date(creado));
                buffer += 3000L;
                target.setProducto(entrada.getProducto());
                target.setCantidad(entrada.getCantidad());
                target.setEntrada(entrada.getId());
                target.setPrecio(entrada.getPrecioVenta());
                boolean ok = getPedido().agregarPartida(target);
                if(ok){
                    target.actualizarPrecioDeLista();                    
                    partidasSource.add(target);
                    validate();
                    logger.info((new StringBuilder("Unidad de venta agregada: ")).append(target).toString());
                } else{
                    MessageUtils.showMessage((new StringBuilder("Ya esta registrado el producto: ")).append(target.getProducto()).toString(), "Unidad de venta");
                }
            }/*
            else{
                target.setCantidad(target.getCantidad() + entrada.getCantidad());
                validate();
            }*/
        }
    }
    
    private void actualizarEmbarque(EntradaPorCompra e){
    	Embarcacion em=e.getRecepcion().getEmbarcacionId();
    	getPedido().setAduana(em.getAduana().getNombre());
    	getPedido().setPedimento(em.getPedimento());
    	getPedido().setPedimentoFecha(em.getAutorizacionAduana());
    }

    public void insertarPartida()
    {
        boolean credito = getPedido().isDeCredito();
        PedidoDetFormModel model = new PedidoDetFormModel(PedidoDet.getPedidoDet());
        model.setCredito(credito);
        model.setSucursal(getPedido().getSucursal());
        PedidoDetFormWork form = new PedidoDetFormWork(model);
        form.setProductos(getProductos());
        form.open();
        if(!form.hasBeenCanceled())
        {
            PedidoDet target = (PedidoDet)form.getModel().getBaseBean();
            boolean ok = getPedido().agregarPartida(target);
            if(ok)
            {
                target.actualizarPrecioDeLista();
                partidasSource.add(target);
                validate();
                logger.info((new StringBuilder("Unidad de venta agregada: ")).append(target).toString());
            } else
            {
                MessageUtils.showMessage((new StringBuilder("Ya esta registrado el producto: ")).append(target.getProducto()).toString(), "Unidad de venta");
            }
        }
    }

    public void editar(PedidoDet source)
    {
        int index = partidasSource.indexOf(source);
        if(index != -1)
        {
            logger.info((new StringBuilder("Editando partida: ")).append(index).append(": ").append(source.getClave()).toString());
            PedidoDet target = PedidoDet.getPedidoDet();
            BeanUtils.copyProperties(source, target, new String[] {
                "id", "version", "log", "pedido"
            });
            boolean credito = getPedido().isDeCredito();
            if(getPedido().getFormaDePago().equals(FormaDePago.CHEQUE_POSTFECHADO))
                credito = false;
            PedidoDetFormModel model = new PedidoDetFormModel(target);
            model.setCredito(credito);
            PedidoDetFormWork form = new PedidoDetFormWork(model);
            form.setProductos(getProductos());
            form.open();
            if(!form.hasBeenCanceled())
            {
                BeanUtils.copyProperties(target, source, new String[] {
                    "id", "version", "log", "pedido"
                });
                source.actualizarPrecioDeLista();
                partidasSource.set(index, source);
                logger.info((new StringBuilder("Partida modificada: ")).append(source).toString());
                validate();
                actualizarImportes();
            }
        }
    }

    public void eliminarPartida(int index)
    {
        PedidoDet det = (PedidoDet)partidasSource.get(index);
        if(MessageUtils.showConfirmationMessage((new StringBuilder("Eliminar partida: ")).append(det.getClave()).toString(), "Pedido"))
            if(det != null)
            {
                boolean ok = getPedido().eliminarPartida(det);
                if(ok)
                {
                    partidasSource.remove(index);
                    validate();
                    return;
                }
            } else
            {
                System.out.println("Existe un error en la seleccion de partidas");
            }
    }

    public void seleccionarCliente(java.awt.Dialog owner)
    {
        if(!isModificable())
        {
            MessageUtils.showMessage("El no es modificable", "Pedido");
        } else
        {
            Cliente c = SelectorDeClientes.seleccionar(owner);
            if(c != null)
                setValue("cliente", c);
        }
    }

    public void asignarCliente(String clave)
    {
        if(!StringUtils.isBlank(clave) && !"1".equals(clave))
        {
            Cliente cliente = ServiceLocator2.getClienteManager().buscarPorClave(clave);
            getPedido().setCliente(cliente);
        }
    }

    public void clienteActualizado()
    {
        if(hayPartidas())
        {
            actualizarImportes();
        } else
        {
            if(getPedido().getCliente().isDeCredito())
                setValue("tipo", com.luxsoft.sw3.ventas.Pedido.Tipo.CREDITO);
            else
                setValue("tipo", com.luxsoft.sw3.ventas.Pedido.Tipo.CONTADO);
            if(getPedido().getCliente().isDeCredito() && getPedido().isDeCredito() && getPedido().getCliente().getCredito().isChequePostfechado())
                setValue("formaDePago", FormaDePago.CHEQUE_POSTFECHADO);
        }
    }

    public boolean isModificable()
    {
        if(getPedido().isFacturado() || getPedido().getAutorizacion() != null)
            return false;
        return !StringUtils.containsIgnoreCase(getPedido().getComentario2(), "CANCELADO");
    }

    protected void tipoDePedidoActualizado()
    {
        if(getPedido().isDeCredito())
            if(getPedido().getCliente() != null)
            {
                Cliente c = getPedido().getCliente();
                if(c.isChequePostfechado())
                    getPedido().setFormaDePago(FormaDePago.CHEQUE_POSTFECHADO);
                else
                    getPedido().setFormaDePago(FormaDePago.EFECTIVO);
            } else
            {
                getPedido().setFormaDePago(FormaDePago.EFECTIVO);
            }
        actualizarImportes();
    }

    private boolean hayPartidas()
    {
        return !getPedido().getPartidas().isEmpty();
    }

    public void actualizarImportes()
    {
        if(isModificable())
        {
            getPedido().actualizarImportes();
            for(int index = 0; index < partidasSource.size(); index++)
            {
                PedidoDet det = (PedidoDet)partidasSource.get(index);
                partidasSource.set(index, det);
            }

        }
    }

    public Pedido persist(){
        Pedido target = getPedido();
        if(target != null){            
            String user = getUsuario();
            target = ServiceLocator2.getPedidosManager().salvar(target,user);
            logger.info("Pedido  persistido: "+target.getFolio());
            return target;
        } else
        {
            return null;
        }
    }

    protected void partidasChanged()
    {
        actualizarImportes();
    }

    public void listChanged(ListEvent listChanges)
    {
        if(listChanges.next())
            switch(listChanges.getType())
            {
            case 0: // '\0'
            case 1: // '\001'
            case 2: // '\002'
                partidasChanged();
                break;
            }
    }

    public EventList getPartidasSource()
    {
        return partidasSource;
    }

    protected EventList getProductos()
    {
        if(productos == null || productos.isEmpty())
        {
            productos = new BasicEventList();
            productos.addAll(ServiceLocator2.getProductoManager().buscarProductosActivos());
        }
        return productos;
    }

    public List getFormasDePago()
    {
        List formas = new ArrayList();
        formas.addAll((Collection)Arrays.asList(FormaDePago.values()));
        return formas;
    }

    public ValueModel getUsuarioHolder()
    {
        return usuarioHolder;
    }

    public ValueModel getPasswordHolder()
    {
        if(passworHoler == null)
        {
            passworHoler = new ValueHolder();
            passworHoler.addValueChangeListener(new PropertyChangeListener() {

                public void propertyChange(PropertyChangeEvent evt)
                {
                    resolveUser(evt.getNewValue());
                }
                
            });
        }
        return passworHoler;
    }

    public void setUsuarioHolder(ValueModel usuarioHolder)
    {
        this.usuarioHolder = usuarioHolder;
    }

    public String getUsuario()
    {
        if(getUsuarioHolder().getValue() == null)
        {
            return null;
        } else
        {
            User user = (User)getUsuarioHolder().getValue();
            return user.getUsername();
        }
    }

    private void resolveUser(Object newValue)
    {
        String s = (String)newValue;
        usuarioHolder.setValue(KernellUtils.buscarUsuarioPorPassword(s));
        if(getPedido().getId() == null)
            getPedido().getLog().setCreateUser(getUsuario());
        getPedido().getLog().setUpdateUser(getUsuario());
        if(usuarioHolder.getValue() == null)
        {
            facturistaHolder.setValue(null);
        } else
        {
            User user = (User)usuarioHolder.getValue();
            facturistaHolder.setValue(user.getFullName());
        }
        validate();
    }

    public ValueModel getFacturistaHolder()
    {
        if(facturistaHolder == null)
            facturistaHolder = new ValueHolder();
        return facturistaHolder;
    }

    private EventList partidasSource;
    private EventList productos;
    private PropertyChangeListener handler;
    private Logger logger;
    private PedidoFormValidator validator;
    private ValueModel usuarioHolder;
    private ValueModel passworHoler;
    private ValueModel facturistaHolder;

}
